package com.lancoo.ccas52.arrangecourse.coursescheduling.allocatetimeslotroom;

import com.lancoo.ccas52.arrangecourse.common.BinaryUtil;
import com.lancoo.ccas52.arrangecourse.common.StrUtil;
import com.lancoo.ccas52.arrangecourse.entities.TeachingClassUnit;
import com.lancoo.ccas52.arrangecourse.entities.TimeslotRoom;

import java.util.Iterator;
import java.util.LinkedList;

/**
 * @Description 分配冲突的教室课时分组信息
 * @Author Fortysun
 * @Date 2023/9/5 17:58
 **/
public class AllocateClashTimeslotRoom extends AllocateTimeslotRoom {
    /**
     * 分配连续的，符合连上节次要求的，教室课时信息列表，给对应的教学班
     * 但是允许周次存在冲突，条件是可用的周次数量，必须至少达到一半以上
     * @param teachingClassUnit 教学班排课单元
     * @param continuousList 连上的教室课时分组信息列表
     * @return
     */
    public LinkedList<TimeslotRoom> start(TeachingClassUnit teachingClassUnit,
                                          LinkedList<TimeslotRoom> continuousList) {
        //定义返回的列表信息
        LinkedList<TimeslotRoom> retList = new LinkedList<>();
        //教学班中的周次字符串
        String teachingClassWeeks = teachingClassUnit.getClassWeeks();
        //定义列表遍历的迭代器
        Iterator iterator = continuousList.iterator();

        while (iterator.hasNext()) {
            TimeslotRoom timeslotRoom = (TimeslotRoom) iterator.next();
            //教室课时分组中的周次字符串
            String timeslotRoomWeeks = timeslotRoom.getWeeks();
            //将两个二进制字符串，进行异或运算，比如10101和11111
            //结果就是01010，这个值，就是剩下的可排课的周次
            String result = BinaryUtil.binaryXOR(timeslotRoomWeeks, teachingClassWeeks);
            //分配给教学班的周次中，教学班剩余可用的周数
            Integer oneNumOfResult = StrUtil.numOfOne(result);
            //如果教室课时分组中的周次，全部都安排给了这个教学班
            if (oneNumOfResult.equals(0)) {
//                //复制一份教室课时分组对象
//                TimeslotRoom newTimeslotRoom = new TimeslotRoom(timeslotRoom);
//                //将对应的删除标记设为可删除
//                newTimeslotRoom.setIsRemove(true);
//                //直接将这个教室课时分组添加到返回列表
//                retList.add(newTimeslotRoom);
                timeslotRoom.setIsRemove(true);
                retList.add(timeslotRoom);
                //因为匹配完这个课时就分配完了，所以直接从列表删除当前的教室课时分组
                iterator.remove();
            } else if(oneNumOfResult > 0){//大于0，说明还有剩余
                //将两个二进制字符串，进行与运算，比如10101和11111
                //结果就是10101，这个值，就是分配给教学班的周次
                String residue = BinaryUtil.binaryAnd(timeslotRoomWeeks, teachingClassWeeks);
                //此时只需要将当前教室课时分组的周次信息，更新为01010即可，
                //供后面的教学班使用
                timeslotRoom.setWeeks(result);
                //复制一份教室课时分组对象
                TimeslotRoom newTimeslotRoom = new TimeslotRoom(timeslotRoom);
                //将其对应的周次信息，设置为分配给教学班的周次
                newTimeslotRoom.setWeeks(residue);
                //将这个新建的教室课时分组对象，添加到返回列表
                retList.add(new TimeslotRoom(newTimeslotRoom));
            }

        }

        return retList;
    }
}
